package rhplus.gestor;

import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.Hashtable;
import java.util.Calendar;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import rhplus.persistencia.ContaDeUtilizador;
import rhplus.persistencia.Hospital;
import rhplus.sistema.CodigoPostal;
import rhplus.sistema.Seguranca;
import rhplus.sistema.UtensiliosParaStrings;

import rhplus.utilizador.Colaborador;
import rhplus.utilizador.Pessoa;

@SuppressWarnings("serial")
public class GestorDeColaboradores extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {

    /*
     * (non-Java-doc)
     *
     * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request,
     *      HttpServletResponse response)
     */
    Calendar c = Calendar.getInstance();
    int ano, mes, dia;
    Date data_nascimento, data_admissao;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        String accao = (String) request.getParameter("accao");

        if (accao.equals(GestorDeColaboradores.INSERIR_COLABORADOR)) {
            inserirColaborador(request, response, session);
        } else if (accao.equals(GestorDeColaboradores.ALTERAR_COLABORADOR)) {
            alterarColaborador(request, response, session);
        } else if (accao.equals(GestorDeColaboradores.REMOVER_COLABORADOR)) {
            removerColaborador(request, response, session);
        } else if (accao.equals(GestorDeColaboradores.VISUALIZAR_COLABORADOR)) {
            visualizarColaborador(request, response, session);
        } else if (accao.equals(GestorDeColaboradores.VISUALIZAR_COLABORADORES)) {
            visualizarColaboradores(request, response, session);
        } else if (accao.equals(CANCELAR_CONTRACTO)) {
            cancelarContracto(request, response, session);
        } else {
            IllegalArgumentException illegal_argument_exception = new IllegalArgumentException();
            session.setAttribute("excepcao", illegal_argument_exception.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }

    /*
     * (non-Java-doc)
     *
     * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request,
     *      HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    public void inserirColaborador(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {

        try {

            String sub_accao = (String) request.getParameter("sub_accao");
            if (sub_accao != null && sub_accao.equals("primeira")) {

                session.removeAttribute("horarios_trabalho");
                session.removeAttribute("especialidades");
                session.removeAttribute("hospitais");

                session.setAttribute("horarios_trabalho", Hospital.lista_horarios());
                session.setAttribute("especialidades", Hospital.lista_especialidades());
                session.setAttribute("hospitais", Hospital.devolveTodos());

                response.sendRedirect("/inserirColaborador.jsp");
            } else if (sub_accao != null && sub_accao.equals("segunda")) {
                if (dadosEstaoValidos(request, GestorDeColaboradores.INSERIR_COLABORADOR)) {

                    Colaborador novo_colaborador = populaTabelaInserirColaborador(request);
                    Pessoa nova_pessoa = populaTabelaInserirPessoa(request);

                    ContaDeUtilizador nova_conta = populaTabelaContaDeUtilizador(request);

                    Colaborador.insere(nova_pessoa, novo_colaborador, nova_conta);

                    session.removeAttribute("erros");

                    session.setAttribute("msg_sucesso", "Colaborador inserido com sucesso.");
                    session.setAttribute("nome_pagina_link", "de inser��o de colaboradores");
                    session.setAttribute("pagina_link", "/Gestor?gestor=gestor_de_colaboradores&accao=inserir_colaborador&sub_accao=primeira");
                    response.sendRedirect("/mostra_sucesso.jsp");

                } else {
                    session.setAttribute("erros", devolveTabelaDeErrosParaInserirColaborador(request));

                    // Propaga dados, previamente inseridos, pela sessao
                    session.setAttribute("nome", request.getParameter("nome"));
                    session.setAttribute("sexo", request.getParameter("sexo"));
                    session.setAttribute("bi", request.getParameter("bi"));
                    session.setAttribute("data_de_nascimento_ano", request.getParameter("data_de_nascimento_ano"));
                    session.setAttribute("data_de_nascimento_mes", request.getParameter("data_de_nascimento_mes"));
                    session.setAttribute("data_de_nascimento_dia", request.getParameter("data_de_nascimento_dia"));
                    session.setAttribute("nif", request.getParameter("nif"));
                    session.setAttribute("email", request.getParameter("email"));
                    session.setAttribute("telefone", request.getParameter("telefone"));
                    session.setAttribute("telemovel", request.getParameter("telemovel"));
                    session.setAttribute("morada", request.getParameter("morada"));
                    session.setAttribute("prefixo_codigo_postal", request.getParameter("prefixo_codigo_postal"));
                    session.setAttribute("sufixo_codigo_postal", request.getParameter("sufixo_codigo_postal"));
                    session.setAttribute("localidade", request.getParameter("localidade"));
                    session.setAttribute("grupo_sanguineo", request.getParameter("grupo_sanguineo"));
                    session.setAttribute("nib", request.getParameter("nib"));
                    session.setAttribute("nss", request.getParameter("nss"));
                    session.setAttribute("data_de_admissao_dia", request.getParameter("data_de_admissao_dia"));
                    session.setAttribute("data_de_admissao_mes", request.getParameter("data_de_admissao_mes"));
                    session.setAttribute("data_de_admissao_ano", request.getParameter("data_de_admissao_ano"));
                    session.setAttribute("vencimento", request.getParameter("vencimento"));
                    session.setAttribute("validade_contrato_dia", request.getParameter("validade_contrato_dia"));
                    session.setAttribute("validade_contrato_mes", request.getParameter("validade_contrato_mes"));
                    session.setAttribute("validade_contrato_ano", request.getParameter("validade_contrato_ano"));
                    session.setAttribute("id_hospital", request.getParameter("id_hospital"));
                    session.setAttribute("horario_trabalho", request.getParameter("horario_trabalho"));

                    session.setAttribute("id_hospital2", request.getParameter("id_hospital2"));
                    session.setAttribute("horario_trabalho2", request.getParameter("horario_trabalho2"));

                    session.setAttribute("tipo", request.getParameter("tipo"));

                    if (((String) request.getParameter("tipo")).equals("medico")) {
                        session.setAttribute("especialidade", request.getParameter("especialidade"));
                    }

                    session.setAttribute("username", request.getParameter("username"));

                    response.sendRedirect("/inserirColaborador.jsp");
                }
            } else {
                session.setAttribute("excepcao", "Url incorrecto.");
                response.sendRedirect("/mostra_erro.jsp");
            }

        } catch (ClassNotFoundException e) {

            e.printStackTrace();
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (InstantiationException e) {

            e.printStackTrace();
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (IllegalAccessException e) {

            e.printStackTrace();
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (NoSuchAlgorithmException e) {

            e.printStackTrace();
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (IOException e) {

            e.printStackTrace();
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }

    public void alterarColaborador(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        try {
            String sub_accao = (String) request.getParameter("sub_accao");
            if (sub_accao != null && sub_accao.equals("primeira")) {

                Long id_pessoa = Long.parseLong(request.getParameter("id"));
                String perfil = ContaDeUtilizador.devolvePerfil(id_pessoa);
                Pessoa pessoa = Pessoa.devolve(id_pessoa);
                Colaborador colaborador = Colaborador.devolvePorIdPessoa(id_pessoa);

                session.setAttribute("horarios_trabalho", Hospital.lista_horarios());
                session.setAttribute("hospitais", Hospital.devolveTodos());

                // Propaga dados, previamente inseridos, pela sessao
                session.setAttribute("nome", pessoa.getNome());
                session.setAttribute("sexo", String.valueOf(pessoa.getSexo()));
                session.setAttribute("bi", pessoa.getBI());
                session.setAttribute("data_de_nascimento_ano", UtensiliosParaDatas.devolveAnoDaData(pessoa.getDataDeNascimento()));
                session.setAttribute("data_de_nascimento_mes", UtensiliosParaDatas.devolveMesDaData(pessoa.getDataDeNascimento()));
                session.setAttribute("data_de_nascimento_dia", UtensiliosParaDatas.devolveDiaDaData(pessoa.getDataDeNascimento()));
                session.setAttribute("nif", pessoa.getNIF());
                session.setAttribute("email", pessoa.getEmail());
                session.setAttribute("telefone", pessoa.getTelefone());
                session.setAttribute("telemovel", pessoa.getTelemovel());
                session.setAttribute("morada", pessoa.getMorada());
                Long id_cp = pessoa.getCodigoPostal();
                session.setAttribute("prefixo_codigo_postal", String.valueOf(CodigoPostal.devolve(id_cp).getPrefixo()));
                session.setAttribute("sufixo_codigo_postal", String.valueOf(CodigoPostal.devolve(id_cp).getSufixo()));
                session.setAttribute("localidade", CodigoPostal.devolve(id_cp).getLocalidade());
                session.setAttribute("grupo_sanguineo", pessoa.getGrupoSanguineo());
                session.setAttribute("nib", colaborador.getNib());
                session.setAttribute("nss", colaborador.getNss());
                session.setAttribute("data_de_admissao_ano", UtensiliosParaDatas.devolveAnoDaData(colaborador.getDataAdmissao()));
                session.setAttribute("data_de_admissao_mes", UtensiliosParaDatas.devolveMesDaData(colaborador.getDataAdmissao()));
                session.setAttribute("data_de_admissao_dia", UtensiliosParaDatas.devolveDiaDaData(colaborador.getDataAdmissao()));
                session.setAttribute("vencimento", colaborador.getVencimento());
                session.setAttribute("validade_contrato_ano", UtensiliosParaDatas.devolveAnoDaData(colaborador.getValidadeContrato()));
                session.setAttribute("validade_contrato_mes", UtensiliosParaDatas.devolveMesDaData(colaborador.getValidadeContrato()));
                session.setAttribute("validade_contrato_dia", UtensiliosParaDatas.devolveDiaDaData(colaborador.getValidadeContrato()));
                session.setAttribute("horario_trabalho", colaborador.getHorarioTrabalho());

                session.setAttribute("horario_trabalho2", colaborador.getHorarioTrabalho2());

                session.setAttribute("tipo", colaborador.getTipo());

                if (perfil.equals("medico")) {
                    session.setAttribute("especialidade", colaborador.getEspecialidade());
                }

                session.setAttribute("id_hospital", colaborador.getIdHospital());

                session.setAttribute("id_hospital2", colaborador.getIdHospital2());

                session.setAttribute("id_pessoa", id_pessoa);

                session.setAttribute("existem_dados", new Boolean(true));

                response.sendRedirect("/alterarColaborador.jsp");
            } else if (sub_accao != null && sub_accao.equals("segunda")) {
                if (dadosEstaoValidos(request, GestorDeColaboradores.ALTERAR_COLABORADOR)) {
                    Long id_pessoa = Long.parseLong(request.getParameter("id"));

                    Pessoa pessoa_dados = populaTabelaInserirPessoa(request);
                    pessoa_dados.setID(id_pessoa);

                    Colaborador dados_do_colaborador = populaTabelaAlterarColaborador(request, session);
                    dados_do_colaborador.setIdPessoa(id_pessoa);

                    /*   Hospital.processaPortabilidadeDeConsultasExistentes(id_hospital_existente, id_hospital2_existente,
                    id_hospital_novo, id_hospital2_novo, id_pessoa_do_colaborador, nome_hospital_existente,
                    nome_hospital2_existente, nome_hospital_novo, nome_hospital2_novo);*/
                    //}Helio23

                    /*  String tipo = (String) session.getAttribute("tipo");
                    if (tipo.equals(Colaborador.MEDICO)) {
                    Medico.altera(dados_do_colaborador);
                    } else if (tipo.equals(Colaborador.ENFERMEIRO)) {
                    Enfermeiro.altera(dados_do_colaborador);
                    } else if (tipo.equals(Colaborador.ADMINISTRATIVO)) {
                    Administrativo.altera(dados_do_colaborador);
                    }*/

                    Pessoa.altera(pessoa_dados);
                    Colaborador.altera(dados_do_colaborador);

                    String password_nova = request.getParameter("password_nova");
                    if (password_nova != null && !password_nova.equals("")) {

                        String username = ContaDeUtilizador.devolveUsername(Long.parseLong(request.getParameter("id")));
                        ContaDeUtilizador.alteraPassword(username, Seguranca.converteParaMD5(password_nova));
                    }
                    // Remove eventual persistencia da hashtable erros na
                    // sessao.
                    session.removeAttribute("erros");


                    //response.sendRedirect("Gestor?gestor=gestor_de_colaboradores&accao=visualizar_colaborador&id=" + id_pessoa);
                    session.setAttribute("msg_sucesso", "Dados alterados com sucesso.");
                    if (!session.getAttribute("perfil").equals("administrador")) {
                        session.setAttribute("nome_pagina_link", "dos dados pessoais");
                        session.setAttribute("pagina_link", "/mostrar_colaborador.jsp");
                    } else {
                        session.setAttribute("nome_pagina_link", "inicial");
                        session.setAttribute("pagina_link", "/index.jsp");
                    }
                    response.sendRedirect("/mostra_sucesso.jsp");


                } else {
                    session.setAttribute("erros", devolveTabelaDeErrosParaAlterarColaborador(request));

                    // Propaga dados, previamente inseridos, pela sessao

                    session.setAttribute("nome", request.getParameter("nome"));
                    session.setAttribute("sexo", request.getParameter("sexo"));
                    session.setAttribute("bi", request.getParameter("bi"));
                    session.setAttribute("data_de_nascimento_ano", request.getParameter("data_de_nascimento_ano"));
                    session.setAttribute("data_de_nascimento_mes", request.getParameter("data_de_nascimento_mes"));
                    session.setAttribute("data_de_nascimento_dia", request.getParameter("data_de_nascimento_dia"));
                    session.setAttribute("nif", request.getParameter("nif"));
                    session.setAttribute("email", request.getParameter("email"));
                    session.setAttribute("telefone", request.getParameter("telefone"));
                    session.setAttribute("telemovel", request.getParameter("telemovel"));
                    session.setAttribute("morada", request.getParameter("morada"));
                    session.setAttribute("prefixo_codigo_postal", request.getParameter("prefixo_codigo_postal"));
                    session.setAttribute("sufixo_codigo_postal", request.getParameter("sufixo_codigo_postal"));
                    session.setAttribute("localidade", request.getParameter("localidade"));
                    session.setAttribute("grupo_sanguineo", request.getParameter("grupo_sanguineo"));
                    session.setAttribute("nib", request.getParameter("nib"));
                    session.setAttribute("nss", request.getParameter("nss"));
                    session.setAttribute("data_de_admissao_dia", request.getParameter("data_de_admissao_dia"));
                    session.setAttribute("data_de_admissao_mes", request.getParameter("data_de_admissao_mes"));
                    session.setAttribute("data_de_admissao_ano", request.getParameter("data_de_admissao_ano"));

                    session.setAttribute("validade_contrato_dia", request.getParameter("validade_contrato_dia"));
                    session.setAttribute("validade_contrato_mes", request.getParameter("validade_contrato_mes"));
                    session.setAttribute("validade_contrato_ano", request.getParameter("validade_contrato_ano"));
                    session.setAttribute("horario_trabalho", request.getParameter("horario_trabalho"));

                    session.setAttribute("horario_trabalho2", request.getParameter("horario_trabalho2"));

                    session.setAttribute("id_hospital", Integer.parseInt(request.getParameter("id_hospital")));

                    session.setAttribute("id_hospital2", Integer.parseInt(request.getParameter("id_hospital2")));

                    session.setAttribute("username", request.getParameter("username"));

                    response.sendRedirect("/alterarColaborador.jsp");
                }
            } else {
                session.setAttribute("excepcao", "Url incorrecto.");
                response.sendRedirect("/mostra_erro.jsp");
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.INSERIR_CLIENTE);
        } catch (InstantiationException e) {
            e.printStackTrace();
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.INSERIR_CLIENTE);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.INSERIR_CLIENTE);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.INSERIR_CLIENTE);
        }
    }

    public void removerColaborador(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        /*try {
        int id_colaborador = Integer.getInteger((String) request.getParameter("id"));
        Colaborador.remove(id_colaborador);

        } catch (ClassNotFoundException e) {
        e.printStackTrace();
        session.setAttribute("excepcao", e.toString());
        response.sendRedirect("/mostra_erro.jsp");
        System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_CLIENTE);
        } catch (InstantiationException e) {
        e.printStackTrace();
        session.setAttribute("excepcao", e.toString());
        response.sendRedirect("/mostra_erro.jsp");
        System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_CLIENTE);
        } catch (IllegalAccessException e) {
        e.printStackTrace();
        session.setAttribute("excepcao", e.toString());
        response.sendRedirect("/mostra_erro.jsp");
        System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_CLIENTE);
        }*/
    }

    public void visualizarColaborador(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        try {

            session.removeAttribute("dados_colaborador");
            session.removeAttribute("colaborador");

            Long id_colaborador = Long.parseLong(request.getParameter("id"));
            String perfil = ContaDeUtilizador.devolvePerfil(id_colaborador);

            Colaborador colaborador = Colaborador.devolvePorIdPessoa(id_colaborador);
            Pessoa dados_colaborador = Pessoa.devolve(id_colaborador);

            session.setAttribute("dados_colaborador", dados_colaborador);
            session.setAttribute("colaborador", colaborador);
            session.setAttribute("username", ContaDeUtilizador.devolveUsername(id_colaborador));

            session.setAttribute("hospital", Hospital.devolve(colaborador.getIdHospital()).getNome());

            Long id_hospital2 = colaborador.getIdHospital2();

            if (id_hospital2 == null || id_hospital2 == 0) {
                session.setAttribute("hospital2", "sem_hospital");
            } else if (id_hospital2 > 0) {
                session.setAttribute("hospital2", Hospital.devolve(id_hospital2).getNome());
            }

            if (perfil.equals("medico")) {
                session.setAttribute("medico", colaborador);
            }

            response.sendRedirect("/mostrar_colaborador.jsp");

        } catch (Exception e) {
            e.printStackTrace();
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_CLIENTE);
        }
    }

    public void visualizarColaboradores(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        /* try {
        session.setAttribute("colaboradores", Colaborador.devolveTodos());

        } catch (  e) {
        e.printStackTrace();
        session.setAttribute("excepcao", e.toString());
        response.sendRedirect("/mostra_erro.jsp");
        System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_CLIENTE);
        } catch (ClassNotFoundException e) {
        e.printStackTrace();
        session.setAttribute("excepcao", e.toString());
        response.sendRedirect("/mostra_erro.jsp");
        System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_CLIENTE);
        } catch (InstantiationException e) {
        e.printStackTrace();
        session.setAttribute("excepcao", e.toString());
        response.sendRedirect("/mostra_erro.jsp");
        System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_CLIENTE);
        } catch (IllegalAccessException e) {
        e.printStackTrace();
        session.setAttribute("excepcao", e.toString());
        response.sendRedirect("/mostra_erro.jsp");
        System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_CLIENTE);
        }*/
    }

    private Pessoa populaTabelaInserirPessoa(final HttpServletRequest request) throws NoSuchAlgorithmException {
        String nome = request.getParameter("nome");
        char sexo = request.getParameter("sexo").charAt(0);
        int bi = Integer.parseInt(request.getParameter("bi"));
        // Data de Nascimento
        int dia = Integer.parseInt(request.getParameter("data_de_nascimento_dia"));
        int mes = Integer.parseInt(request.getParameter("data_de_nascimento_mes"));
        int ano = Integer.parseInt(request.getParameter("data_de_nascimento_ano"));
        Date data = UtensiliosParaDatas.devolveData(ano, mes, dia);
        int nif = Integer.parseInt(request.getParameter("nif"));
        String email = request.getParameter("email");
        int telefone = Integer.parseInt(request.getParameter("telefone"));
        int telemovel = Integer.parseInt(request.getParameter("telemovel"));
        String morada = request.getParameter("morada");
        String sangue = request.getParameter("grupo_sanguineo");

        // Verificar se o codigo postal existe
        // Se nao existir inserir na base de dados
        int prefixo_codigo_postal = populaTabelaCodigoPostal(request).getPrefixo();
        int sufixo_codigo_postal = populaTabelaCodigoPostal(request).getSufixo();
        if (!CodigoPostal.existe(prefixo_codigo_postal, sufixo_codigo_postal)) {
            CodigoPostal.insere(populaTabelaCodigoPostal(request));
        }
        // ja existe o codigo postal, por isso é necessário ir buscar o id_codigo postal
        Long codigo = CodigoPostal.devolve(prefixo_codigo_postal, sufixo_codigo_postal).getIdCodigoPostal();

        return new Pessoa(nome, sexo, bi, data, nif, email, telefone, telemovel, morada, sangue, codigo);
    }

    private Hashtable<String, Object> populaTabelaCancelarContracto(final HttpServletRequest request) throws NoSuchAlgorithmException {
        /*
        Hashtable<String, Object> dados = populaTabelaInserirPessoa(request);

        dados.put("var_nib", (String) request.getParameter("nib"));
        dados.put("var_nss", (String) request.getParameter("nss"));

        // Data de admissão
        dados.put("var_data_admissao", UtensiliosParaDatas.devolveDataEmString(Integer.parseInt((String) request.getParameter("data_de_admissao_ano")), Integer.parseInt((String) request.getParameter("data_de_admissao_mes")), Integer.parseInt((String) request.getParameter("data_de_admissao_dia"))));
        dados.put("var_vencimento", (String) request.getParameter("vencimento"));

        // Data de validade de contrato
        dados.put("var_validade_contrato", UtensiliosParaDatas.devolveDataEmString(Integer.parseInt((String) request.getParameter("validade_contrato_ano")), Integer.parseInt((String) request.getParameter("validade_contrato_mes")), Integer.parseInt((String) request.getParameter("validade_contrato_dia"))));
        dados.put("var_horario_trabalho", (String) request.getParameter("horario_trabalho"));
        dados.put("var_tipo", (String) request.getParameter("tipo"));
        if (((String) request.getParameter("tipo")).equals("medico")) {
        dados.put("var_especialidade", (String) request.getParameter("especialidade"));
        }

        dados.put("var_id_hospital", (String) request.getParameter("id_hospital"));

        return dados;*/
        return null;
    }

    private Colaborador populaTabelaInserirColaborador(final HttpServletRequest request) throws NoSuchAlgorithmException {

        String nib = request.getParameter("nib");
        String nss = request.getParameter("nss");

        // Data de admissão
        int dia_ad = Integer.parseInt(request.getParameter("data_de_admissao_dia"));
        int mes_ad = Integer.parseInt(request.getParameter("data_de_admissao_mes"));
        int ano_ad = Integer.parseInt(request.getParameter("data_de_admissao_ano"));
        Date dat_admissao = UtensiliosParaDatas.devolveData(ano_ad, mes_ad, dia_ad);

        Double vencimento = Double.parseDouble(request.getParameter("vencimento"));

        // Data de validade de contrato
        int dia_v = Integer.parseInt(request.getParameter("data_de_admissao_dia"));
        int mes_v = Integer.parseInt(request.getParameter("data_de_admissao_mes"));
        int ano_v = Integer.parseInt(request.getParameter("data_de_admissao_ano"));
        Date data_validade = UtensiliosParaDatas.devolveData(ano_v, mes_v, dia_v);

        String horario = request.getParameter("horario_trabalho");

        String tipo = request.getParameter("tipo");

        String especialidade = null;
        if (request.getParameter("tipo").equals("medico")) {
            especialidade = request.getParameter("especialidade");
        }

        Long id_hospital = Long.parseLong(request.getParameter("id_hospital"));

        Long id_hospital2 = Long.parseLong(request.getParameter("id_hospital2"));

        if (id_hospital2 == null) {
            id_hospital2 = new Long("0");
        }

        String horario_trabalho2 = request.getParameter("horario_trabalho2");

        if (horario_trabalho2 == null || horario_trabalho2.trim().equals("")) {
            horario_trabalho2 = "8:00-14:00";
        }
        return new Colaborador(nib, nss, dat_admissao, vencimento, data_validade, horario, id_hospital, horario_trabalho2, id_hospital2, tipo, especialidade);
    }

    private Colaborador populaTabelaAlterarColaborador(final HttpServletRequest request, HttpSession session) throws NoSuchAlgorithmException {

        String nib = request.getParameter("nib");
        String nss = request.getParameter("nss");

        String horario = request.getParameter("horario_trabalho");

        String tipo = request.getParameter("tipo");
        String especialidade = (String) session.getAttribute("especialidade");
        String horario_trabalho2 = null;
        if (request.getParameter("id_hospital2").equals("") || request.getParameter("id_hospital2").equals("0")) {
            horario_trabalho2 = "8:00-14:00";
        } else {
            horario_trabalho2 = request.getParameter("horario_trabalho2");
        }
        Double vencimento = 0.0;
        if (!((String) session.getAttribute("tipo")).equals("administrativo")) {
            vencimento = (Double) session.getAttribute("vencimento");
        } else {
            vencimento = Double.parseDouble(request.getParameter("vencimento"));
        }

        Long id_pessoa = (Long) session.getAttribute("id_pessoa");
        Colaborador c = Colaborador.devolvePorIdPessoa(id_pessoa);
        Long id_hosp1 = null;
        Long id_hospital_existente = c.getIdHospital();
        Long id_hospital_novo = Long.parseLong(request.getParameter("id_hospital"));
        if (id_hospital_existente != id_hospital_novo) {
            id_hosp1 = id_hospital_novo;
        } else {
            id_hosp1 = id_hospital_existente;
        }

        Long id_hosp2 = null;
        Long id_hospital2_existente = c.getIdHospital2();
        Long id_hospital2_novo = Long.parseLong(request.getParameter("id_hospital2"));

        if (id_hospital2_existente != id_hospital2_novo) {
            id_hosp2 = id_hospital_novo;
        } else {
            id_hosp2 = id_hospital_existente;
        }

        int dia_ad = Integer.parseInt((String) session.getAttribute("data_de_admissao_dia"));
        int mes_ad = Integer.parseInt((String) session.getAttribute("data_de_admissao_mes"));
        int ano_ad = Integer.parseInt((String) session.getAttribute("data_de_admissao_ano"));
        Date dat_admissao = UtensiliosParaDatas.devolveData(ano_ad, mes_ad, dia_ad);

        int dia_v = Integer.parseInt((String) session.getAttribute("data_de_admissao_dia"));
        int mes_v = Integer.parseInt((String) session.getAttribute("data_de_admissao_mes"));
        int ano_v = Integer.parseInt((String) session.getAttribute("data_de_admissao_ano"));
        Date data_validade = UtensiliosParaDatas.devolveData(ano_v, mes_v, dia_v);

        return new Colaborador(nib, nss, dat_admissao, vencimento, data_validade, horario, id_hosp1, horario_trabalho2, id_hosp2, tipo, especialidade);
    }

    private CodigoPostal populaTabelaCodigoPostal(final HttpServletRequest request) {

        return new CodigoPostal(Integer.parseInt(request.getParameter("prefixo_codigo_postal")),
                Integer.parseInt(request.getParameter("sufixo_codigo_postal")),
                request.getParameter("localidade"));
    }

    private ContaDeUtilizador populaTabelaContaDeUtilizador(final HttpServletRequest request) throws NoSuchAlgorithmException {

        String user = request.getParameter("username");
        String password = Seguranca.converteParaMD5(request.getParameter("password"));
        String estado = "1";

        return new ContaDeUtilizador(user, password, estado);
    }

    private boolean dadosEstaoValidos(final HttpServletRequest request, final String action) throws ClassNotFoundException,
            InstantiationException, IllegalAccessException {
        return devolveTabelaDeErros(request, action).isEmpty();
    }

    private Hashtable<String, String> devolveTabelaDeErros(final HttpServletRequest request, final String action) throws
            ClassNotFoundException, InstantiationException, IllegalAccessException {
        if (action.equals(GestorDeColaboradores.INSERIR_COLABORADOR)) {
            return devolveTabelaDeErrosParaInserirColaborador(request);
        } else if (action.equals(GestorDeColaboradores.ALTERAR_COLABORADOR)) {
            return devolveTabelaDeErrosParaAlterarColaborador(request);
        } else if (action.equals(GestorDeColaboradores.CANCELAR_CONTRACTO)) {
            return devolveTabelaDeErrosParaCancelarContracto(request);
        } else {
            return new Hashtable<String, String>();
        }
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaInserirColaborador(final HttpServletRequest request) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

        Hashtable<String, String> tabela_de_erros = devolveTabelaDeErrosParaInserirPessoa(request);

        //Tipo
        String tipo = (String) request.getParameter("tipo");
        if (tipo == null || tipo.trim().equals("")) {
            tabela_de_erros.put("tipo", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!tipo.equals(Colaborador.MEDICO) && !tipo.equals(Colaborador.ADMINISTRATIVO) && !tipo.equals(Colaborador.ENFERMEIRO)) {
            tabela_de_erros.put("tipo", "Valor inválido. Deverá ser médico, administrativo ou enfermeiro.");
        }


        //NIB
        String nib = (String) request.getParameter("nib");
        if (nib == null || nib.trim().equals("")) {
            tabela_de_erros.put("nib", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(nib)) {
            tabela_de_erros.put("nib", "O campo NIB deverá ser numérico.");
        } else if (nib.length() != 21) {
            tabela_de_erros.put("nib", "NIB inválido. Deverá ter 21 caracteres.");
        }


        //NSS
        String nss = (String) request.getParameter("nss");
        if (nss == null || nss.trim().equals("")) {
            tabela_de_erros.put("nss", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(nss)) {
            tabela_de_erros.put("nss", "O campo NSS deverá ser numérico.");
        } else if (nss.length() != 11) {
            tabela_de_erros.put("nss", "NISS inválido. Deverá ter 11 caracteres.");
        }


        //Vencimento
        String vencimento = (String) request.getParameter("vencimento");
        if (vencimento == null || vencimento.trim().equals("")) {
            tabela_de_erros.put("vencimento", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumeroReal(vencimento)) {
            tabela_de_erros.put("vencimento", "O campo vencimento deverá ser numérico.");
        } else if (Double.parseDouble(vencimento) < 0) {
            tabela_de_erros.put("vencimento", "O vencimento deverá ser superior a 0.");
        }


        // Data de admissão
        int data_admissao_ano = -1;
        int data_admissao_mes = -1;
        int data_admissao_dia = -1;
        String data_de_admissao_ano = (String) request.getParameter("data_de_admissao_ano");
        if (data_de_admissao_ano == null || data_de_admissao_ano.trim().equals("")) {
            tabela_de_erros.put("data_de_admissao_ano", "Ano: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_de_admissao_ano)) {
            tabela_de_erros.put("data_de_admissao_ano", "O campo ano da data de admissão deverá ser numérico.");
        }

        String data_de_admissao_mes = (String) request.getParameter("data_de_admissao_mes");
        if (data_de_admissao_mes == null || data_de_admissao_mes.trim().equals("")) {
            tabela_de_erros.put("data_de_admissao_mes", "Mês: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_de_admissao_mes)) {
            tabela_de_erros.put("data_de_admissao_mes", "O campo mês da data de admissão deverá ser numérico.");
        }

        String data_de_admissao_dia = (String) request.getParameter("data_de_admissao_dia");
        if (data_de_admissao_dia == null || data_de_admissao_dia.trim().equals("")) {
            tabela_de_erros.put("data_de_admissao_dia", "Dia: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_de_admissao_dia)) {
            tabela_de_erros.put("data_de_admissao_dia", "O campo dia da data de admissão deverá ser numérico.");
        }

        //N�o est� a verificar se � maior
        if (data_de_admissao_ano != null && !data_de_admissao_ano.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_admissao_ano)
                && data_de_admissao_mes != null && !data_de_admissao_mes.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_admissao_mes)
                && data_de_admissao_dia != null && !data_de_admissao_dia.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_admissao_dia)) {
            ano = Integer.parseInt(data_de_admissao_ano);
            mes = Integer.parseInt(data_de_admissao_mes);
            dia = Integer.parseInt(data_de_admissao_dia);
            data_admissao = UtensiliosParaDatas.devolveData(ano, mes, dia);

            /*  if (!UtensiliosParaDatas.eValidaDataAdmissao(ano, mes, dia, data_nascimento))
            {
            tabela_de_erros.put("data_de_admissao", "Formato de Data Errado.");
            }*/
        }

        Date admission_date = UtensiliosParaDatas.devolveData(ano, mes, dia);
        Date data_actual = UtensiliosParaDatas.devolveData(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DATE));
        
        // Validade do contrato
        String validade_contrato_ano = (String) request.getParameter("validade_contrato_ano");
        if (validade_contrato_ano == null || validade_contrato_ano.trim().equals("")) {
            tabela_de_erros.put("validade_contrato_ano", "Ano: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(validade_contrato_ano)) {
            tabela_de_erros.put("validade_contrato_ano", "O campo ano da data de validade de contrato deverá ser numérico.");
        }

        String validade_contrato_mes = (String) request.getParameter("validade_contrato_mes");
        if (validade_contrato_mes == null || validade_contrato_mes.trim().equals("")) {
            tabela_de_erros.put("validade_contrato_mes", "Mês: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(validade_contrato_mes)) {
            tabela_de_erros.put("validade_contrato_mes", "O campo mês da data de validade de contrato deverá ser numérico.");
        }

        String validade_contrato_dia = (String) request.getParameter("validade_contrato_dia");
        if (validade_contrato_dia == null || validade_contrato_dia.trim().equals("")) {
            tabela_de_erros.put("validade_contrato_dia", "Dia: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(validade_contrato_dia)) {
            tabela_de_erros.put("validade_contrato_dia", "O campo dia da data de validade de contrato deverá ser numérico.");
        }

        if (validade_contrato_ano != null && !validade_contrato_ano.trim().equals("") && UtensiliosParaStrings.eUmNumero(validade_contrato_ano)
                && validade_contrato_mes != null && !validade_contrato_mes.trim().equals("")
                && UtensiliosParaStrings.eUmNumero(validade_contrato_mes) && validade_contrato_dia != null
                && !validade_contrato_dia.trim().equals("") && UtensiliosParaStrings.eUmNumero(validade_contrato_dia)) {
            int ano2 = Integer.parseInt(validade_contrato_ano);
            int mes2 = Integer.parseInt(validade_contrato_mes);
            int dia2 = Integer.parseInt(validade_contrato_dia);
            Date date_valid = UtensiliosParaDatas.devolveData(ano2, mes2, dia2);
            Date data_ad = UtensiliosParaDatas.devolveData(data_admissao_ano, data_admissao_mes, data_admissao_dia);
            if (date_valid.before(data_actual)) {
                tabela_de_erros.put("validade_contrato", "Formato de Data Errado.");
            }
            if (date_valid.before(data_ad)) {
                tabela_de_erros.put("validade_contrato", "Formato de Data Errado.");
            }
        }

        //Especialidade
        String especialidade = (String) request.getParameter("especialidade");
        if ((tipo != null && tipo.equals(Colaborador.MEDICO)) && (especialidade == null || especialidade.trim().equals(""))) {
            tabela_de_erros.put("especialidade", "Campo Obrigatório. Não pode estar vazio.");
        }


        //Id hospital
        String id_hospital = (String) request.getParameter("id_hospital");
        if (id_hospital == null || id_hospital.trim().equals("")) {
            tabela_de_erros.put("id_hospital", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(id_hospital)) {
            tabela_de_erros.put("id_hospital", "Deverá seleccionar um hospital.");
        }

        //Horario Trabalho
        String horario_trabalho = (String) request.getParameter("horario_trabalho");
        if (horario_trabalho == null || horario_trabalho.trim().equals("")) {
            tabela_de_erros.put("horario_trabalho", "Campo Obrigatório. Não pode estar vazio.");
        }


        //Id hospital2
        String id_hospital2 = (String) request.getParameter("id_hospital2");
        if (!(id_hospital == null || id_hospital.trim().equals("")) && id_hospital2.equals(id_hospital)) {
            tabela_de_erros.put("id_hospital2", "O segundo turno tem de ser efectuado num Hospital diferente do primeiro.");
        }

        //Horario Trabalho2
        String horario_trabalho2 = (String) request.getParameter("horario_trabalho2");
        if (!(horario_trabalho == null || horario_trabalho.trim().equals("")) && horario_trabalho2.equals(horario_trabalho)) {
            tabela_de_erros.put("horario_trabalho2", "O segundo turno tem ter um horario diferente do primeiro.");
        } else if (!id_hospital2.equals("0") && (horario_trabalho2 == null || horario_trabalho2.trim().equals(""))) {
            tabela_de_erros.put("horario_trabalho2", "Tem de indicar o horario para o segundo turno.");
        }


        //Nome

        String nome = (String) request.getParameter("nome");
        if (nome == null || nome.trim().equals("")) {
            tabela_de_erros.put("nome", "Campo Obrigat�rio. N�o pode estar vazio.");
        } else if (UtensiliosParaStrings.eApenasLetras(nome)) {
            tabela_de_erros.put("nome", "O campo nome pode apenas conter caracteres alfab�ticos.");
        }

        return tabela_de_erros;
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaCancelarContracto(final HttpServletRequest request) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

        Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();

        // Data de Rescis�o
        String data_de_rescisao_ano = (String) request.getParameter("data_de_rescisao_ano");
        if (data_de_rescisao_ano == null || data_de_rescisao_ano.trim().equals("")) {
            tabela_de_erros.put("data_de_rescisao_ano", "Ano: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_de_rescisao_ano)) {
            tabela_de_erros.put("data_de_rescisao_ano", "O campo ano da data de rescisao deverá ser numérico.");
        }

        String data_de_rescisao_mes = (String) request.getParameter("data_de_rescisao_mes");
        if (data_de_rescisao_mes == null || data_de_rescisao_mes.trim().equals("")) {
            tabela_de_erros.put("data_de_rescisao_mes", "Mês: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_de_rescisao_mes)) {
            tabela_de_erros.put("data_de_rescisao_mes", "O campo mês da data de rescisao deverá ser numérico.");
        }

        String data_de_rescisao_dia = (String) request.getParameter("data_de_rescisao_dia");
        if (data_de_rescisao_dia == null || data_de_rescisao_dia.trim().equals("")) {
            tabela_de_erros.put("data_de_rescisao_dia", "Dia: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_de_rescisao_dia)) {
            tabela_de_erros.put("data_de_rescisao_dia", "O campo dia da data de rescisao deverá ser numérico.");
        }

        if (data_de_rescisao_ano != null && !data_de_rescisao_ano.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_rescisao_ano)
                && data_de_rescisao_mes != null && !data_de_rescisao_mes.trim().equals("")
                && UtensiliosParaStrings.eUmNumero(data_de_rescisao_mes) && data_de_rescisao_dia != null
                && !data_de_rescisao_dia.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_rescisao_dia)) {
            int ano = Integer.parseInt(data_de_rescisao_ano);
            int mes = Integer.parseInt(data_de_rescisao_mes);
            int dia = Integer.parseInt(data_de_rescisao_dia);

            if (!UtensiliosParaDatas.eValidaDataRescisao(ano, mes, dia)) {
                tabela_de_erros.put("data_de_rescisao", "Formato de Data Errado.");
            }
            if (!UtensiliosParaDatas.eMaiorDoQue(UtensiliosParaDatas.devolveData(ano, mes, dia), UtensiliosParaDatas.agora())) {
                tabela_de_erros.put("data_de_rescisao", "Data de rescis�o deve ser superior � data actual.");
            }
        }
        return tabela_de_erros;
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaAlterarColaborador(final HttpServletRequest request) {

        Hashtable<String, String> tabela_de_erros = devolveTabelaDeErrosParaAlterarPessoa(request);
        /*
        String nib = request.getParameter("nib");
        if (nib == null || nib.trim().equals("")) {
        tabela_de_erros.put("nib", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(nib)) {
        tabela_de_erros.put("nib", "O campo NIB deverá ser numérico.");
        } else if (nib.length() != 21) {
        tabela_de_erros.put("nib", "NIB inválido. Deverá ter 21 caracteres.");
        }

        String nss = request.getParameter("nss");
        if (nss == null || nss.trim().equals("")) {
        tabela_de_erros.put("nss", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(nss)) {
        tabela_de_erros.put("nss", "O campo NSS deverá ser numérico.");
        } else if (nss.length() != 11) {
        tabela_de_erros.put("nss", "NISS inválido. Deverá ter 11 caracteres.");
        }

        // Data de admissão

        String data_de_admissao_ano = request.getParameter("data_de_admissao_ano");
        if (data_de_admissao_ano == null || data_de_admissao_ano.trim().equals("")) {
        tabela_de_erros.put("data_de_admissao_ano", "Ano: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_de_admissao_ano)) {
        tabela_de_erros.put("data_de_admissao_ano", "O campo ano da data de admissão deverá ser numérico.");
        }

        String data_de_admissao_mes = request.getParameter("data_de_admissao_mes");
        if (data_de_admissao_mes == null || data_de_admissao_mes.trim().equals("")) {
        tabela_de_erros.put("data_de_admissao_mes", "Mês: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_de_admissao_mes)) {
        tabela_de_erros.put("data_de_admissao_mes", "O campo mês da data de admissão deverá ser numérico.");
        }

        String data_de_admissao_dia = request.getParameter("data_de_admissao_dia");
        if (data_de_admissao_dia == null || data_de_admissao_dia.trim().equals("")) {
        tabela_de_erros.put("data_de_admissao_dia", "Dia: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_de_admissao_dia)) {
        tabela_de_erros.put("data_de_admissao_dia", "O campo dia da data de admissão deverá ser numérico.");
        }

        if (data_de_admissao_ano != null && !data_de_admissao_ano.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_admissao_ano)
        && data_de_admissao_mes != null && !data_de_admissao_mes.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_admissao_mes)
        && data_de_admissao_dia != null && !data_de_admissao_dia.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_admissao_dia)) {
        int ano = Integer.parseInt(data_de_admissao_ano);
        int mes = Integer.parseInt(data_de_admissao_mes);
        int dia = Integer.parseInt(data_de_admissao_dia);

        String ano_aux = request.getParameter("data_de_nascimento_ano");
        String mes_aux = request.getParameter("data_de_nascimento_mes");
        String dia_aux = request.getParameter("data_de_nascimento_dia");

        int ano_aux1 = Integer.parseInt(ano_aux);
        int mes_aux1 = Integer.parseInt(mes_aux);
        int dia_aux1 = Integer.parseInt(dia_aux);

        if (!UtensiliosParaDatas.eValidaDataAdmissao(ano, mes, dia, UtensiliosParaDatas.devolveData(ano_aux1, mes_aux1, dia_aux1))) //}Dani1
        {
        tabela_de_erros.put("data_de_admissao", "Formato de Data Errado.");
        }
        }

        // Validade do contrato
        String validade_contrato_ano = request.getParameter("validade_contrato_ano");
        if (validade_contrato_ano == null || validade_contrato_ano.trim().equals("")) {
        tabela_de_erros.put("validade_contrato_ano", "Ano: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(validade_contrato_ano)) {
        tabela_de_erros.put("validade_contrato_ano", "O campo ano da data de validade de contrato deverá ser numérico.");
        }

        String validade_contrato_mes = request.getParameter("validade_contrato_mes");
        if (validade_contrato_mes == null || validade_contrato_mes.trim().equals("")) {
        tabela_de_erros.put("validade_contrato_mes", "Mês: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(validade_contrato_mes)) {
        tabela_de_erros.put("validade_contrato_mes", "O campo mês da data de validade de contrato deverá ser numérico.");
        }

        String validade_contrato_dia = request.getParameter("validade_contrato_dia");
        if (validade_contrato_dia == null || validade_contrato_dia.trim().equals("")) {
        tabela_de_erros.put("validade_contrato_dia", "Dia: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(validade_contrato_dia)) {
        tabela_de_erros.put("validade_contrato_dia", "O campo dia da data de validade de contrato deverá ser numérico.");
        }

        if (validade_contrato_ano != null && !validade_contrato_ano.trim().equals("") && UtensiliosParaStrings.eUmNumero(validade_contrato_ano)
        && validade_contrato_mes != null && !validade_contrato_mes.trim().equals("")
        && UtensiliosParaStrings.eUmNumero(validade_contrato_mes) && validade_contrato_dia != null
        && !validade_contrato_dia.trim().equals("") && UtensiliosParaStrings.eUmNumero(validade_contrato_dia)) {
        int ano = Integer.parseInt(validade_contrato_ano);
        int mes = Integer.parseInt(validade_contrato_mes);
        int dia = Integer.parseInt(validade_contrato_dia);


        String ano_aux = request.getParameter("data_de_admissao_ano");
        String mes_aux = request.getParameter("data_de_admissao_mes");
        String dia_aux = request.getParameter("data_de_admissao_dia");

        int ano_aux1 = Integer.parseInt(ano_aux);
        int mes_aux1 = Integer.parseInt(mes_aux);
        int dia_aux1 = Integer.parseInt(dia_aux);

        String ano_aux_nasc = request.getParameter("data_de_nascimento_ano");
        String mes_aux_nasc = request.getParameter("data_de_nascimento_mes");
        String dia_aux_nasc = request.getParameter("data_de_nascimento_dia");

        int ano_aux_nasc1 = Integer.parseInt(ano_aux_nasc);
        int mes_aux_nasc1 = Integer.parseInt(mes_aux_nasc);
        int dia_aux_nasc1 = Integer.parseInt(dia_aux_nasc);

        System.out.println("Data de admissao" + UtensiliosParaDatas.devolveData(ano_aux1, mes_aux1, dia_aux1));
        System.out.println("Data de nascimento" + UtensiliosParaDatas.devolveData(ano_aux_nasc1, mes_aux_nasc1, dia_aux_nasc1));


        if (!UtensiliosParaDatas.eValidaDataContrato(ano, mes, dia, UtensiliosParaDatas.devolveData(ano_aux1, mes_aux1, dia_aux1), UtensiliosParaDatas.devolveData(ano_aux_nasc1, mes_aux_nasc1, dia_aux_nasc1))) {
        tabela_de_erros.put("validade_contrato", "Formato de Data Errado.");


        }
        //            else if (!tabela_de_erros.contains("data_de_admissao")
        //					&& !tabela_de_erros.contains("data_de_admissao_ano")
        //					&& !tabela_de_erros.contains("data_de_admissao_mes")
        //					&& !tabela_de_erros.contains("data_de_admissao_dia")
        //					&& UtensiliosParaDatas.eValida(Integer.parseInt(data_de_admissao_ano), Integer.parseInt(data_de_admissao_mes), Integer
        //							.parseInt(data_de_admissao_dia))
        //					&& !UtensiliosParaDatas.eMaiorDoQue(UtensiliosParaDatas.devolveData(ano, mes, dia), UtensiliosParaDatas.devolveData(Integer
        //							.parseInt(data_de_admissao_ano), Integer.parseInt(data_de_admissao_mes), Integer.parseInt(data_de_admissao_dia))))
        //
        //				tabela_de_erros.put("validade_contrato", "Validade Inferior a Data de Admissão.");


        }

        String horario_trabalho = request.getParameter("horario_trabalho");
        if (horario_trabalho == null || horario_trabalho.trim().equals("")) {
        tabela_de_erros.put("horario_trabalho", "Campo Obrigatório. Não pode estar vazio.");
        }

        String id_hospital = request.getParameter("id_hospital");
        if (id_hospital == null || id_hospital.trim().equals("")) {
        tabela_de_erros.put("id_hospital", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(id_hospital)) {
        tabela_de_erros.put("id_hospital", "Deverá seleccionar um hospital.");
        }


        //Id hospital2
        String id_hospital2 = (String) request.getParameter("id_hospital2");
        if (!(id_hospital == null || id_hospital.trim().equals("")) && id_hospital2.equals(id_hospital)) {
        tabela_de_erros.put("id_hospital2", "O segundo turno tem de ser efectuado num Hospital diferente do primeiro.");
        }

        //Horario Trabalho2
        String horario_trabalho2 = (String) request.getParameter("horario_trabalho2");
        if (!(horario_trabalho == null || horario_trabalho.trim().equals("")) && horario_trabalho2.equals(horario_trabalho)) {
        tabela_de_erros.put("horario_trabalho2", "O segundo turno tem ter um horario diferente do primeiro.");
        } else if (!id_hospital2.equals("0") && (horario_trabalho2 == null || horario_trabalho2.trim().equals(""))) {
        tabela_de_erros.put("horario_trabalho2", "Tem de indicar o horario para o segundo turno.");
        }
         */

        return tabela_de_erros;
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaInserirPessoa(final HttpServletRequest request) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

        Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();
        /*
        String nome = (String) request.getParameter("nome");
        if (nome == null || nome.trim().equals("")) {
        tabela_de_erros.put("nome", "Campo Obrigatório. Não pode estar vazio.");
        }

        String sexo = (String) request.getParameter("sexo");
        if (sexo == null || sexo.trim().equals("")) {
        tabela_de_erros.put("sexo", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!(sexo.trim().equals("M") || sexo.trim().equals("F"))) {
        tabela_de_erros.put("sexo", "Valor inválido. O campo sexo apenas poderá assumir o valor \"M\" ou \"F\".");
        }

        String bi = (String) request.getParameter("bi");
        if (bi == null || bi.trim().equals("")) {
        tabela_de_erros.put("bi", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(bi)) {
        tabela_de_erros.put("bi", "O campo BI deverá ser numérico.");
        } else if (Integer.parseInt(bi) <= 0 || Integer.parseInt(bi) >= 100000000) {
        tabela_de_erros.put("bi", "Número de BI inválido. Deverá estar dentro do intervalo [0-100000000], exclusive.");
        }

        // Data de Nascimento
        String data_de_nascimento_ano = (String) request.getParameter("data_de_nascimento_ano");
        if (data_de_nascimento_ano == null || data_de_nascimento_ano.trim().equals("")) {
        tabela_de_erros.put("data_de_nascimento_ano", "Ano: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_de_nascimento_ano)) {
        tabela_de_erros.put("data_de_nascimento_ano", "O campo ano da data de nascimento deverá ser numérico.");
        }

        String data_de_nascimento_mes = (String) request.getParameter("data_de_nascimento_mes");
        if (data_de_nascimento_mes == null || data_de_nascimento_mes.trim().equals("")) {
        tabela_de_erros.put("data_de_nascimento_mes", "Mês: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_de_nascimento_mes)) {
        tabela_de_erros.put("data_de_nascimento_mes", "O campo mês da data de nascimento deverá ser numérico.");
        }

        String data_de_nascimento_dia = (String) request.getParameter("data_de_nascimento_dia");
        if (data_de_nascimento_dia == null || data_de_nascimento_dia.trim().equals("")) {
        tabela_de_erros.put("data_de_nascimento_dia", "Dia: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_de_nascimento_dia)) {
        tabela_de_erros.put("data_de_nascimento_dia", "O campo dia da data de nascimento deverá ser numérico.");
        }

        if (data_de_nascimento_ano != null && !data_de_nascimento_ano.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_nascimento_ano)
        && data_de_nascimento_mes != null && !data_de_nascimento_mes.trim().equals("")
        && UtensiliosParaStrings.eUmNumero(data_de_nascimento_mes) && data_de_nascimento_dia != null
        && !data_de_nascimento_dia.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_nascimento_dia)) {
        int ano = Integer.parseInt(data_de_nascimento_ano);
        int mes = Integer.parseInt(data_de_nascimento_mes);
        int dia = Integer.parseInt(data_de_nascimento_dia);

        if (!UtensiliosParaDatas.eValidaDataNascimento(ano, mes, dia)) //}Dani
        {
        tabela_de_erros.put("data_de_nascimento", "Formato de Data Errado.");
        }

        data_nascimento = UtensiliosParaDatas.devolveData(ano, mes, dia);
        }

        String nif = (String) request.getParameter("nif");
        if (nif == null || nif.trim().equals("")) {
        tabela_de_erros.put("nif", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(nif)) {
        tabela_de_erros.put("nif", "O campo NIF deverá ser numérico.");
        } else if (nif.length() < 8 || nif.length() > 9) {
        tabela_de_erros.put("nif", "Número de NIF inválido. Deverá ter entre 8 a 9 caracteres, inclusive.");
        }

        String email = (String) request.getParameter("email");
        if (email == null || email.trim().equals("")) {
        tabela_de_erros.put("email", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmEmail(email)) {
        tabela_de_erros.put("email", "Formato de E-Mail Inválido.");
        }

        String telefone = (String) request.getParameter("telefone");
        if (telefone == null || telefone.trim().equals("")) {
        tabela_de_erros.put("telefone", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(telefone)) {
        tabela_de_erros.put("telefone", "O campo telefone deverá ser numérico.");
        }

        String telemovel = (String) request.getParameter("telemovel");
        if (telemovel == null || telemovel.trim().equals("")) {
        tabela_de_erros.put("telemovel", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(telemovel)) {
        tabela_de_erros.put("telemovel", "O campo telemóvel deverá ser numérico.");
        }

        String morada = (String) request.getParameter("morada");
        if (morada == null || morada.trim().equals("")) {
        tabela_de_erros.put("morada", "Campo Obrigatório. Não pode estar vazio.");
        }

        // Codigo Postal
        String prefixo_codigo_postal = (String) request.getParameter("prefixo_codigo_postal");
        if (prefixo_codigo_postal == null || prefixo_codigo_postal.trim().equals("")) {
        tabela_de_erros.put("prefixo_codigo_postal", "Prefixo: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(prefixo_codigo_postal)) {
        tabela_de_erros.put("prefixo_codigo_postal", "O campo prefixo do código postal deverá ser numérico.");
        }

        String sufixo_codigo_postal = (String) request.getParameter("sufixo_codigo_postal");
        if (sufixo_codigo_postal == null || sufixo_codigo_postal.trim().equals("")) {
        tabela_de_erros.put("sufixo_codigo_postal", "Sufixo: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(sufixo_codigo_postal)) {
        tabela_de_erros.put("sufixo_codigo_postal", "O campo sufixo do código postal deverá ser numérico.");
        }

        String localidade = (String) request.getParameter("localidade");
        if (localidade == null || localidade.trim().equals("")) {
        tabela_de_erros.put("localidade", "Campo Obrigatório. Não pode estar vazio.");
        } 
        else if (UtensiliosParaStrings.eApenasLetras(localidade)) {
        tabela_de_erros.put("localidade", "O campo localidade pode apenas conter caracteres alfab�ticos.");
        }
        

        String grupo_sanguineo = (String) request.getParameter("grupo_sanguineo");
        if (grupo_sanguineo == null || grupo_sanguineo.trim().equals("")) {
        tabela_de_erros.put("grupo_sanguineo", "Campo Obrigatório. Não pode estar vazio.");
        }
        if (!grupo_sanguineo.equals("O+") && !grupo_sanguineo.equals("A+") && !grupo_sanguineo.equals("B+") && !grupo_sanguineo.equals("AB+")
        && !grupo_sanguineo.equals("O-") && !grupo_sanguineo.equals("A-") && !grupo_sanguineo.equals("B-") && !grupo_sanguineo.equals("AB-")
        && !grupo_sanguineo.equals("desconhecido")) {
        tabela_de_erros.put("grupo_sanguineo", "O Grupo Sanguíneo deverá ter um dos seguintes valores: O+, A+, B+, AB+, O-, A-, B- ou AB-.");
        }

        String username = (String) request.getParameter("username");
        if (username == null || username.trim().equals("")) {
        tabela_de_erros.put("username", "Campo Obrigatório. Não pode estar vazio.");
        } else if (username.length() < 6) {
        tabela_de_erros.put("username", "Tamanho inválido. O campo username deverá ter pelo menos 6 caracteres.");
        } else if (ContaDeUtilizador.existeUsername(username)) {
        tabela_de_erros.put("username", "Username já existente.");
        }

        String password = (String) request.getParameter("password");
        if (password == null || password.trim().equals("")) {
        tabela_de_erros.put("password", "Campo Obrigatório. Não pode estar vazio.");
        } else if (password.length() < 6) {
        tabela_de_erros.put("password", "Tamanho inválido. O campo password deverá ter pelo menos 6 caracteres.");
        }

        String verification_password = (String) request.getParameter("verification_password");
        if (verification_password == null || verification_password.trim().equals("")) {
        tabela_de_erros.put("verification_password", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!verification_password.equals(password)) {
        tabela_de_erros.put("verification_password", "Não coincide com a password.");
        }
         */
        return tabela_de_erros;
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaAlterarPessoa(final HttpServletRequest request) {
        Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();
        /*
        String nome = (String) request.getParameter("nome");
        if (nome == null || nome.trim().equals("")) {
        tabela_de_erros.put("nome", "Campo Obrigatório. Não pode estar vazioAlterarPessoa.");
        
        } else if (UtensiliosParaStrings.eApenasLetras(nome)) {
        tabela_de_erros.put("nome", "O campo nome pode apenas conter caracteres alfab�ticos.");
        }


        String sexo = (String) request.getParameter("sexo");
        if (sexo == null || sexo.trim().equals("")) {
        tabela_de_erros.put("sexo", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!(sexo.trim().equals("M") || sexo.trim().equals("F"))) {
        tabela_de_erros.put("sexo", "Valor inválido. O campo sexo apenas poderá assumir o valor \"M\" ou \"F\".");
        }

        String bi = (String) request.getParameter("bi");
        if (bi == null || bi.trim().equals("")) {
        tabela_de_erros.put("bi", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(bi)) {
        tabela_de_erros.put("bi", "O campo BI deverá ser numérico.");
        } else if (Integer.parseInt(bi) <= 0 || Integer.parseInt(bi) >= 100000000) {
        tabela_de_erros.put("bi", "Número de BI inválido. Deverá estar dentro do intervalo [0-100000000], exclusive.");
        }

        // Data de Nascimento
        String data_de_nascimento_ano = (String) request.getParameter("data_de_nascimento_ano");
        if (data_de_nascimento_ano == null || data_de_nascimento_ano.trim().equals("")) {
        tabela_de_erros.put("data_de_nascimento_ano", "Ano: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_de_nascimento_ano)) {
        tabela_de_erros.put("data_de_nascimento_ano", "O campo ano da data de nascimento deverá ser numérico.");
        }

        String data_de_nascimento_mes = (String) request.getParameter("data_de_nascimento_mes");
        if (data_de_nascimento_mes == null || data_de_nascimento_mes.trim().equals("")) {
        tabela_de_erros.put("data_de_nascimento_mes", "Mês: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_de_nascimento_mes)) {
        tabela_de_erros.put("data_de_nascimento_mes", "O campo mês da data de nascimento deverá ser numérico.");
        }

        String data_de_nascimento_dia = (String) request.getParameter("data_de_nascimento_dia");
        if (data_de_nascimento_dia == null || data_de_nascimento_dia.trim().equals("")) {
        tabela_de_erros.put("data_de_nascimento_dia", "Dia: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_de_nascimento_dia)) {
        tabela_de_erros.put("data_de_nascimento_dia", "O campo dia da data de nascimento deverá ser numérico.");
        }

        if (data_de_nascimento_ano != null && !data_de_nascimento_ano.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_nascimento_ano)
        && data_de_nascimento_mes != null && !data_de_nascimento_mes.trim().equals("")
        && UtensiliosParaStrings.eUmNumero(data_de_nascimento_mes) && data_de_nascimento_dia != null
        && !data_de_nascimento_dia.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_nascimento_dia)) {
        int ano = Integer.parseInt(data_de_nascimento_ano);
        int mes = Integer.parseInt(data_de_nascimento_mes);
        int dia = Integer.parseInt(data_de_nascimento_dia);

        if (!UtensiliosParaDatas.eValida(ano, mes, dia)) //}Dani
        {
        tabela_de_erros.put("data_de_nascimento", "Formato de Data Errado.");
        }
        }

        String nif = (String) request.getParameter("nif");
        if (nif == null || nif.trim().equals("")) {
        tabela_de_erros.put("nif", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(nif)) {
        tabela_de_erros.put("nif", "O campo NIF deverá ser numérico.");
        } else if (nif.length() < 8 || nif.length() > 9) {
        tabela_de_erros.put("nif", "Número de NIF inválido. Deverá ter entre 8 a 9 caracteres, inclusive.");
        }

        String email = (String) request.getParameter("email");
        if (email == null || email.trim().equals("")) {
        tabela_de_erros.put("email", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmEmail(email)) {
        tabela_de_erros.put("email", "Formato de E-Mail Inválido.");
        }

        String telefone = (String) request.getParameter("telefone");
        if (telefone == null || telefone.trim().equals("")) {
        tabela_de_erros.put("telefone", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(telefone)) {
        tabela_de_erros.put("telefone", "O campo telefone deverá ser numérico.");
        }

        String telemovel = (String) request.getParameter("telemovel");
        if (telemovel == null || telemovel.trim().equals("")) {
        tabela_de_erros.put("telemovel", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(telemovel)) {
        tabela_de_erros.put("telemovel", "O campo telemóvel deverá ser numérico.");
        }

        String morada = (String) request.getParameter("morada");
        if (morada == null || morada.trim().equals("")) {
        tabela_de_erros.put("morada", "Campo Obrigatório. Não pode estar vazio.");
        }

        // Codigo Postal
        String prefixo_codigo_postal = (String) request.getParameter("prefixo_codigo_postal");
        if (prefixo_codigo_postal == null || prefixo_codigo_postal.trim().equals("")) {
        tabela_de_erros.put("prefixo_codigo_postal", "Prefixo: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(prefixo_codigo_postal)) {
        tabela_de_erros.put("prefixo_codigo_postal", "O campo prefixo do código postal deverá ser numérico.");
        }

        String sufixo_codigo_postal = (String) request.getParameter("sufixo_codigo_postal");
        if (sufixo_codigo_postal == null || sufixo_codigo_postal.trim().equals("")) {
        tabela_de_erros.put("sufixo_codigo_postal", "Sufixo: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(sufixo_codigo_postal)) {
        tabela_de_erros.put("sufixo_codigo_postal", "O campo sufixo do código postal deverá ser numérico.");
        }

        String localidade = (String) request.getParameter("localidade");
        System.out.println("Este � o valor da localidade: " + localidade);
        if (localidade == null || localidade.trim().equals("")) {
        tabela_de_erros.put("localidade", "Campo Obrigatório. Não pode estar vazio.");
        } 
        else if (UtensiliosParaStrings.eApenasLetras(localidade)) {
        System.out.println("Entrei no else if que vai dar erro na localidade");
        tabela_de_erros.put("localidade", "O campo localidade pode apenas conter caracteres alfab�ticos.");
        }
        

        String grupo_sanguineo = (String) request.getParameter("grupo_sanguineo");
        if (grupo_sanguineo == null || grupo_sanguineo.trim().equals("")) {
        tabela_de_erros.put("grupo_sanguineo", "Campo Obrigatório. Não pode estar vazio.");
        }
        if (!grupo_sanguineo.equals("O+") && !grupo_sanguineo.equals("A+") && !grupo_sanguineo.equals("B+") && !grupo_sanguineo.equals("AB+")
        && !grupo_sanguineo.equals("O-") && !grupo_sanguineo.equals("A-") && !grupo_sanguineo.equals("B-") && !grupo_sanguineo.equals("AB-")
        && !grupo_sanguineo.equals("desconhecido")) {
        tabela_de_erros.put("grupo_sanguineo", "O Grupo Sanguíneo deverá ter um dos seguintes valores: O+, A+, B+, AB+, O-, A-, B- ou AB-.");
        }

        String password_antiga = (String) request.getParameter("password_antiga");
        String password_nova = (String) request.getParameter("password_nova");
        String verification_password_nova = (String) request.getParameter("verification_password_nova");

        
        int id_pessoa = Integer.parseInt((String) request.getParameter("id"));
        if (password_nova.trim().equals("") && verification_password_nova.trim().equals("")) {
        //nao fazer nada
        } else {
        if (password_antiga != null && (password_nova.trim().equals("") || password_nova == null) && verification_password_nova != null) {
        tabela_de_erros.put("password_nova", "Campo Obrigatório. Não pode estar vazio.");
        } else {
        if (password_antiga != null && password_nova != null && (verification_password_nova.trim().equals("") || verification_password_nova == null)) {
        tabela_de_erros.put("verification_password_nova", "Campo Obrigatório. Não pode estar vazio.");
        } else {
        if ((password_antiga.trim().equals("") || password_antiga == null) && password_nova != null && verification_password_nova != null) {
        tabela_de_erros.put("password_antiga", "Campo Obrigatório. Não pode estar vazio.");
        } else {
        if (password_antiga != null && password_nova != null && verification_password_nova != null
        && !verification_password_nova.equals(password_nova)) {
        tabela_de_erros.put("verification_password_nova", "Não coincide com a password.");
        }

        //String password = (String) request.getParameter("password");
        if (password_nova != null && !password_nova.trim().equals("") && password_nova.length() < 6) {
        tabela_de_erros.put("password_nova", "Tamanho inválido. O campo password deverá ter pelo menos 6 caracteres.");
        }

        //String verification_password = (String) request.getParameter("verification_password");
        if (verification_password_nova != null && !verification_password_nova.trim().equals("") && !verification_password_nova.equals(password_nova)) {
        tabela_de_erros.put("verification_password_nova", "Não coincide com a password.");
        }

        if (!(password_antiga.trim().equals(""))) {
        HttpSession session = request.getSession();
        String password_real = "qqh";
        String password_antiga_md5 = "qq2";
        try {

        String username = ContaDeUtilizador.devolveUsername(id_pessoa);
        password_real = ContaDeUtilizador.devolvePassword(username);

        password_antiga_md5 = Seguranca.converteParaMD5(password_antiga);

        if (!(password_real.equals(password_antiga_md5))) {
        tabela_de_erros.put("password_antiga", "A Password n�o corresponde � existente.");
        }
        } catch (Exception e) {
        System.out.println("erro: " + e);
        tabela_de_erros.put("password_antiga", "Por motivos de seguan�a n�o � poss�vel alterar a sua password agora. Por favor tente mais tarde.");
        }
        }
        }
        }
        }
        }
         */
        return tabela_de_erros;
    }

    public void cancelarContracto(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {

        try {

            if (dadosEstaoValidos(request, GestorDeColaboradores.CANCELAR_CONTRACTO)) {

                Long id_colaborador = Long.parseLong(request.getParameter("id"));
                String motivo = request.getParameter("motivo");

                int dia = Integer.parseInt(request.getParameter("data_de_rescisao_dia"));
                int mes = Integer.parseInt(request.getParameter("data_de_rescisao_mes"));
                int ano = Integer.parseInt(request.getParameter("data_de_rescisao_ano"));
                Date dat_recisao = UtensiliosParaDatas.devolveData(ano, mes, dia);

                Colaborador.cancelaContracto(id_colaborador, dat_recisao, motivo);

                session.setAttribute("msg_sucesso", "Contracto Cancelado com Sucesso.");
                session.setAttribute("nome_pagina_link", "das consultas");
                session.setAttribute("pagina_link", "area_cliente.jsp");
                response.sendRedirect("/mostra_sucesso.jsp");

            } else {
                session.setAttribute("erros", devolveTabelaDeErrosParaCancelarContracto(request));

                //p�e dados de volta
                session.setAttribute("motivo", request.getParameter("motivo"));
                session.setAttribute("data_de_rescisao_dia", request.getParameter("data_de_rescisao_dia"));
                session.setAttribute("data_de_rescisao_mes", request.getParameter("data_de_rescisao_mes"));
                session.setAttribute("data_de_rescisao_ano", request.getParameter("data_de_rescisao_ano"));

                response.sendRedirect("/cancelar_contracto.jsp");
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_CLIENTE);
        } catch (InstantiationException e) {
            e.printStackTrace();
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_CLIENTE);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_CLIENTE);
        }

    }
    public static final String INSERIR_COLABORADOR = "inserir_colaborador";
    public static final String ALTERAR_COLABORADOR = "alterar_colaborador";
    public static final String REMOVER_COLABORADOR = "remover_colaborador";
    public static final String VISUALIZAR_COLABORADOR = "visualizar_colaborador";
    public static final String VISUALIZAR_COLABORADORES = "visualizar_colaboradores";
    public static final String CANCELAR_CONTRACTO = "cancelar_contracto";
}

